package ConcurrentProgramming;

/**
 * 捕获异常
 * 无法在线程中抛出Exception，直接编译错误,但是可以抛出运行时期的异常 RuntimeException
 *
 * Thread的run方法是不抛出任何检查型异常的，但是它自身却可能因为一个异常而被中止，导致这个线程的终结。
 *
 * 可以看到在多线程中通过try....catch试图捕获线程的异常是不可取的。
 *
 * 1. 由于线程的特性，我们不能捕获从线程中逃逸的异常。一旦异常逃出任务的run方法，他就会向外传播到控制台
 *    除非采取特殊的步骤捕获这种错误。在Java SE5之前，我们可以采用线程组的方式来捕获这种异常，但是Java
 *    SE5之后，我们可以财通Executor来解决这个问题
 *
 */

class CatchThreadException extends Thread {
    @Override
    public void run() {
        try {
            System.out.println(1 / 0);
        } catch (Exception e) {
            System.out.println("子线程");
        }

    }
}


public class CatchException {
    public static void main(String[] args) throws Exception{
        try {
            new CatchThreadException().start();
        } catch (Exception e) {
            System.out.println("主线程捕获的异常"); // 程序未到达这里，说明主线程无法捕获子线程的异常
        }
    }

    public static void test() {
        new CatchThreadException().start();
    }
}


